package com.tao.design.template

/**
 *
 * @ProjectName:    lab
 * @Package:        com.tao.design
 * @ClassName:      Template
 * @Description:     java类作用描述
 * @Author:         wangxf
 * @CreateDate:     2022/4/26 11:57
 * @UpdateUser:     更新者
 * @UpdateDate:     2022/4/26 11:57
 * @UpdateRemark:   更新说明
 * @Version:        1.0
 */

/**
 * eg: 茶和咖啡的制作流程
 *
 *     一类事物的泛化 相对于 策略模式 （对单个事物行为（算法）的 封装  可动态的切换算法 ）
 *
 * 说明: 在一个方法中定义一个算法的骨架，而将一些步骤延迟到子类中 。模板可以在不改变算法结构的情况下 重新定义算法中的某些步骤
 *
 * 编程准则 底层组件挂靠到高层组件上 由高层组件来判断 啥时候调用底层组件
 */
abstract class CoffeeBeverage {


    fun prepareRecipe() {
        boilWater()
        brew()
        pourInCup()
        addCondiments()
    }

    abstract fun boilWater()
    abstract fun pourInCup()
    abstract fun addCondiments()

    abstract fun brew()
}

class Coffee : CoffeeBeverage() {

    override fun boilWater() {
    }

    override fun pourInCup() {
    }

    override fun addCondiments() {
    }

    override fun brew() {
    }
}

class Tea : CoffeeBeverage() {

    override fun boilWater() {

    }

    override fun pourInCup() {

    }

    override fun addCondiments() {
    }

    override fun brew() {
    }
}

fun main() {
    var coffee = Coffee()
    coffee.prepareRecipe()

    var tea = Tea()
    tea.prepareRecipe()

}